<?php
require_once FW_DIR_FRAMEWORK_VENDOR.DS.'XMLRPC'.DS.'xmlrpc.inc';
require_once FW_DIR_FRAMEWORK_VENDOR.DS.'XMLRPC'.DS.'xmlrpcs.inc';

/**
 * 유틸리티 - XML-RPC(Server/Client)
 *
 * 참고 : 이 유틸리티는 vendor/XMLRPC (xmlrpc-2.2.2) 를 참조합니다.
 *
 * 샘플 : Online demo server - http://phpxmlrpc.sourceforge.net/server.php
 *
 * @copyright (C) 2006-2008 G. Giunta
 * @license code licensed under the BSD License: http://phpxmlrpc.sourceforge.net/license.txt
 *
 * @link http://phpxmlrpc.sourceforge.net
 *
 * @package util
 *
 * @author jylee3@simplexi.com
 * @version 1.0
 */
class utilXmlrpc
{
    /**
     * XMLRPC 라이브러리 로드
     *
     * utilXmlrpc, utilXmlrpcClient, utilXmlrpcServer 클래스 호출 전 xmlrpcresp 등 내부 함수 및 클래스를 사용하려고 한다면, 사용전 이 함수를 호출하여 주시기 바랍니다.
     *
     * <code>
     * utilXmlrpc::load();
     *
     * $xmlrpcmsg = new xmlrpcmsg('xmlrpc.call', array(php_xmlrpc_encode('merong')));
     *
     * $server = new utilXmlrpcServer(....);
     * </code>
     *
     * @return    void
     */
    public static function load()
    {
        return true;
    }

    /**
     * XMLRPC Client 인스턴스
     *
     * $sPath 파라미터를 통해 서버 주소($sServer) 및  서버 포트($iPort), 메소드($sMethod)를 정의할 수 있습니다.
     *
     * <code>
     * // XMLRPC Demo Server
     * $xmlrpc = utilXmlrpc::clientXMLRPC("/server.php", "phpxmlrpc.sourceforge.net", 80);
     * //$xmlrpc->setDebug(1);
     *
     * $xmlrpcmsg = new xmlrpcmsg('examples.getStateName', array(php_xmlrpc_encode(1)));
     *
     * // @var $xmlrpcresp xmlrpcresp
     * $xmlrpcresp = $xmlrpc->send($xmlrpcmsg);
     *
     * if (!$xmlrpcresp->faultCode()) {
     *     $sResult = $xmlrpcresp->value()->scalarval();
     * }
     * </code>
     *
     * @param    String    $sPath    XMLRPC 요청 URI eg.'http://username:password@hostname/path?arg=value#fragment', '/server.php'
     * @param    String    $sServer    XMLRPC 서버 주소 eg.'phpxmlrpc.sourceforge.net'
     * @param    Port    $iPort    XMLRPC 서버 포트    eg. 80(기본값:80)
     * @param    String    $sMethod    XMLRPC Method
     *
     * @return    utilXmlrpcClient
     */
    public static function clientXMLRPC($sPath, $sServer='', $iPort=80, $sMethod='')
    {
        return new utilXmlrpcClient($sPath, $sServer, $iPort, $sMethod);
    }

    /**
     * XMLRPC Server 인스턴스
     *
     * <code>
     * utilXmlrpc::load();
     *
     * function xmlrpc_test(xmlrpcmsg $msg)
     * {
     *     $sMsg = php_xmlrpc_decode($msg->getParam(0));
     *
     *     return new xmlrpcresp(php_xmlrpc_encode($sMsg));
     * }
     *
     * //run the server
     * $server = utilXmlrpc::serverXMLRPC(
     *     array(
     *       'xmlrpc.call' => array(
     *       'function' => 'xmlrpc_test',
     *       'signature' => array(array('mixed', 'string')),
     *       'docstring' => 'test xmlrpc calls to remote servers.'
     *         )
     *     ), false
     * );
     *
     * $xmlrpcmsg = new xmlrpcmsg('xmlrpc.call', array(php_xmlrpc_encode('merong')));
     *
     * $xmlrpcresp = $server->execute($xmlrpcmsg);
     *
     * // @var $xmlrpcval xmlrpcval
     * $xmlrpcval = $xmlrpcresp->value();
     *
     * $this->assertEquals('merong', $xmlrpcval->getval());
     * </code>
     *
     * @param    Array    $aDispMap    XMLRPC Dispatch Map
     * @param    Boolean    $bServiceNow    XMLRPC Service Start(기본값:true)
     *
     * @return    utilXmlrpcServer
     */
    public static function serverXMLRPC($aDispMap=null, $bServiceNow=true)
    {
        return new utilXmlrpcServer($aDispMap, $bServiceNow);
    }
}
